package me.learningandroid.ch2_6.fragmentdemo;

import android.os.Bundle;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

public class MainActivity extends AppCompatActivity {
    private InputFragment inputFragment;
    private ListFragment listFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 静态加载的`Fragment`,通过Id获取对象
        inputFragment = (InputFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentleft);
        // 静态加载的`Fragment`，可以在这里进一步初始化，如注册回调函数等
        inputFragment.setOnAddBtnListener((contactData) -> {
            DataRepository.getInstance().add(contactData);
            listFragment.reload(DataRepository.getInstance().listAll());
        });
        Log.d(getClass().getName(), inputFragment.getLifecycle().getCurrentState().toString());

        listFragment = ListFragment.newInstance(DataRepository.getInstance().listAll());

        //`FragmentManager`控制了`Fragment`的动态加载、移除。
        // 一批相关的`Fragment`操作必须被包含在一个事务中，事务的起止使用方法`beginTransaction`和`commit`。
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentright, listFragment)
                .commit();

        // 对于动态加载的片段，如果需要进一步初始化如注册回调函数等，需要在`activity.addFragmentOnAttachListener`中。
        // 原因: 1. 不建议`Fragment`中获取`Activity`对象，进而调用`Activity`中的方法，这样造成Fragment和Activity间的循环依赖。
        //   2. `Activity`的`onCreate`不能直接初始化片`Fragment`，因为Activity运行中随时可能重启`Fragment`，重启时这部分代码不会执行。
        getSupportFragmentManager().addFragmentOnAttachListener((fragmentManager, fragment) -> {
            if (fragment instanceof ListFragment) {
                ListFragment listFragment = (ListFragment)fragment;
                listFragment.setOnItemClickedListener((id)->{
                    ContactData contactData = DataRepository.getInstance().selectById(id);
                    fragmentManager
                            .beginTransaction()
                            .replace(R.id.fragmentright, DetailsFragment.newInstance(id, contactData.name, contactData.phone))
                            .hide(fragmentManager.findFragmentById(R.id.fragmentleft))
                            // 默认地,`Fragment`的更替不会记录在返回栈中,所以点击返回按钮会直接退出整个Activity
                            // 使用`addToBackStack`让当前的状态保存在返回栈中,实现`Fragment`的后退
                            // 这里的`null`是`addToBackstack`的状态名称,一般传空即可
                            .addToBackStack(null)
                            .commit();
                    return null;
                });
            } else if (fragment instanceof DetailsFragment) {
                DetailsFragment detailsFragment = (DetailsFragment)fragment;
                detailsFragment.setOnDeleteListener((id) -> {
                    DataRepository.getInstance().delete(id);
                    listFragment.reload(DataRepository.getInstance().listAll());
                    fragmentManager.popBackStack();
                });
                detailsFragment.setOnUpdateListener((id, contactData) -> {
                    DataRepository.getInstance().save(id, contactData);
                    listFragment.reload(DataRepository.getInstance().listAll());
                    fragmentManager.popBackStack();
                });
            }
        });


    }

    // 因为`onAttachFragment`已经弃用，这里不做介绍，使用方法和`supportFragmentManager().addFragmentOnAttachListener`一样
    @Override
    public void onAttachFragment(@NonNull Fragment fragment) {
        super.onAttachFragment(fragment);
    }
}